package controller;

import bo.UsuarioBO;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import model.Usuario;
import util.ConsUtil;
import util.CustomException;
import util.FacesUtil;
import util.LibUtil;
import util.MailUtil;

@ManagedBean(name = "trocarSenhaController")
@ViewScoped
public class TrocarSenhaController implements Serializable {

    private UsuarioBO usuarioBO = new UsuarioBO();
    private String email;
    private String senha;
    private String novaSenha;
    private String confirmarNovaSenha;
    private long codigoSenha;
    private String codigoSenhaUsuario;
    private int passoTrocarSenha = 1;

    public void enviarCodigoSenha() {
        try {
            Usuario usu = usuarioBO.selecionarPorEmail(email);
            if (usu != null) {
                setCodigoSenha(LibUtil.getDataAtual("yyyyMMddHHmmss").getTime());
                MailUtil.enviarEmail(ConsUtil.AUTO_EMAIL, email, "[e-Home] Solicitação de troca de senha", "Prezado " + usu.getUsuNome() + ", segue seu código para troca de senha: " + getCodigoSenha());
                setPassoTrocarSenha(2);
            } else {
                FacesUtil.exibirMsgError(null, "Atenção!", "E-mail não encontrado!");
            }
        } catch (CustomException e) {
            setCodigoSenha(0);
            setPassoTrocarSenha(1);
            FacesUtil.exibirMsgExcecao(e);
        } catch (Exception e) {
            setCodigoSenha(0);
            setPassoTrocarSenha(1);
            FacesUtil.exibirMsgExcecao(new CustomException("Falha ao enviar e-mail.", e));
        }
    }

    public void confirmarCodigoSenha() {
        if (String.valueOf(codigoSenha).equals(codigoSenhaUsuario)) {
            setPassoTrocarSenha(3);
        } else {
            FacesUtil.exibirMsgError(null, "Atenção!", "Código inválido!");
        }
    }

    public void salvar() {
        try {
            Usuario usuario = FacesUtil.getUsuarioLogado();
            if (usuario == null) {
                usuario = usuarioBO.selecionarPorEmail(email);
            }

            if (!novaSenha.equals(confirmarNovaSenha)) {
                FacesUtil.exibirMsgError(null, "Atenção", "A nova senha e a confirmação devem ser iguais!");
            } else if ((usuario.getUsuSenha() != null) && (!usuario.getUsuSenha().isEmpty())) {
                if ((senha != null) && (!senha.equals(usuario.getUsuSenha()))) {
                    FacesUtil.exibirMsgError(null, "Atenção", "A senha atual está incorreta!");
                } else if ((senha != null) && (novaSenha.equals(senha))) {
                    FacesUtil.exibirMsgError(null, "Atenção", "A nova senha não deve ser igual à senha atual!");
                } else {
                    usuario.setUsuSenha(novaSenha);
                    usuarioBO.salvar(usuario);
                    FacesUtil.exibirMsgInfo(null, "Concluído", "Senha alterada com sucesso!");
                    setPassoTrocarSenha(4);
                }
            } else {
                usuario.setUsuSenha(novaSenha);
                usuarioBO.salvar(usuario);
                FacesUtil.exibirMsgInfo(null, "Concluído", "Senha alterada com sucesso!");
                setPassoTrocarSenha(4);
            }
        } catch (CustomException e) {
            FacesUtil.exibirMsgExcecao(e);
        }
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getNovaSenha() {
        return novaSenha;
    }

    public void setNovaSenha(String novaSenha) {
        this.novaSenha = novaSenha;
    }

    public String getConfirmarNovaSenha() {
        return confirmarNovaSenha;
    }

    public void setConfirmarNovaSenha(String confirmarNovaSenha) {
        this.confirmarNovaSenha = confirmarNovaSenha;
    }

    public long getCodigoSenha() {
        return codigoSenha;
    }

    public void setCodigoSenha(long codigoSenha) {
        this.codigoSenha = codigoSenha;
    }

    public String getCodigoSenhaUsuario() {
        return codigoSenhaUsuario;
    }

    public void setCodigoSenhaUsuario(String codigoSenhaUsuario) {
        this.codigoSenhaUsuario = codigoSenhaUsuario;
    }

    public int getPassoTrocarSenha() {
        return passoTrocarSenha;
    }

    public void setPassoTrocarSenha(int passoTrocarSenha) {
        this.passoTrocarSenha = passoTrocarSenha;
    }
}
